home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib16.dsk / APPLE TALKER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  5KB  |  138 lines

  1. 1  REM **********************
  2. 2  REM *   APPLE  TALKER    *
  3. 3  REM *   BY  MIKE  EVE    *
  4. 4  REM * COPYRIGHT (C) 1983 *
  5. 5  REM * BY MICROSPARC, INC *
  6. 6  REM * LINCOLN, MA. 01773 *
  7. 7  REM **********************
  8. 20  PRINT  CHR$(4);"BLOAD APPLE TALKER.OBJ": REM    LOAD AT $300
  9. 30  REM  INITIALIZATION
  10. 40  DEF  FN PK(X) =  PEEK(X) +256 * PEEK(X +1)
  11. 50  ONERR  GOTO 1210
  12. 60 M2 =  FN PK(115): REM  GET HIMEM
  13. 70 M1 =  FN PK(105): REM  TOP OF PROGRAM
  14. 80 M1 = (2 + INT(M1/1000)) *1000: REM  1000<VARIABLE STORAGE<2000
  15. 90 P1 = M1:P2 = P1: REM    BUFFER PTRS
  16. 100 O1 = P1:O2 = P2
  17. 110 TW = 5
  18. 120 TD = 11: POKE 780, INT(TD): REM    COMMON DELAY
  19. 130  HIMEM: M1: REM    SET NEW HIMEM
  20. 140 BS = 1/(8 *(5 *(TD -1) +87) *1E -6): REM BYTES/SECOND
  21. 150 S$ = ".SOUND": REM  SAVE FILE SUFFIX
  22. 160  REM    DEFINE MENU ITEMS
  23. 170 C$(1) = "ECHO"
  24. 180 C$(2) = "RECORD"
  25. 190 C$(3) = "PLAY"
  26. 200 C$(4) = "SAVE"
  27. 210 C$(5) = "LOAD"
  28. 220 C$(6) = "RESTORE POINTERS"
  29. 230 C$(7) = "SET POINTERS"
  30. 240 C$(8) = "QUIT"
  31. 250 MC = 8
  32. 260  REM    DISPLAY SCREEN
  33. 270  HOME : PRINT "** COPYRIGHT 1983 BY MICROSPARC, INC. **": PRINT  TAB( 13);"APPLE  TALKER": PRINT 
  34. 280  FOR I = 1 TO MC: PRINT  TAB( 10);I;") ";C$(I): NEXT I
  35. 290  GOSUB 1150: REM  PRINT STATUS
  36. 300  VTAB MC +5: HTAB 10
  37. 310  INPUT "COMMAND ?";C: IF C <1  OR C >MC  THEN 260
  38. 320  HTAB 10: INVERSE : PRINT : PRINT C$(C): NORMAL : PRINT 
  39. 330  ON C GOSUB 350,390,470,660,700,820,850,1050
  40. 340  GOTO 260
  41. 350  REM   ECHO
  42. 360  PRINT "HIT ANY KEY TO STOP"
  43. 370  CALL 774
  44. 380  RETURN 
  45. 390  REM  RECORD
  46. 400 P1 = M1:P2 = P1 +TW *BS -1
  47. 410  GOSUB 1090: CALL 777: REM  ZERO BUFFER
  48. 420  GOSUB 1090: REM  SETUP
  49. 430  PRINT "HIT ANY KEY TO BEGIN"
  50. 440  CALL 774: REM   ECHO TILL KEY
  51. 450  CALL 768: REM   RECORD
  52. 460  RETURN 
  53. 470  REM   PLAYBACK 
  54. 480  PRINT "USE KEYS 1 AND 2 TO EDIT": PRINT "ANY OTHER TO EXIT"
  55. 490  GOSUB 1090: REM  SETUP
  56. 500  CALL 771: REM  PLAY
  57. 510 KY =  PEEK(25): REM  READ KEY
  58. 520  IF KY = 0  THEN  RETURN : REM  NO KEY
  59. 530 KY = KY -128 - ASC("0")
  60. 540  IF KY = 1  THEN  GOTO 570
  61. 550  IF KY = 2  THEN  GOTO 620
  62. 560  RETURN 
  63. 570  IF P2 < FN PK(6)  THEN 500: REM  P1 MUST BE > P2
  64. 580 O1 = P1:P1 =  FN PK(6): REM   SAVE BEGIN
  65. 590  GOSUB 1150: REM   PRINT STATUS
  66. 600  GOSUB 1130: REM   PAUSE
  67. 610  GOTO 500: REM  PLAY MORE
  68. 620 O2 = P2:P2 =  FN PK(6): REM   SAVE END
  69. 630  GOSUB 1150: REM    PRINT STATUS
  70. 640  GOSUB 1130: REM   PAUSE
  71. 650  GOTO 500
  72. 660  REM   SAVE 
  73. 670  INPUT "FILENAME ? ";F$
  74. 680  PRINT  CHR$(4)"BSAVE"F$S$",A" INT(P1);",L"; INT(P2 -P1)
  75. 690  RETURN 
  76. 700  REM   LOAD 
  77. 710  IF P2 = M1  THEN 770: REM    DO NOTHING
  78. 720  INPUT "APPEND ?(Y/N)";A$
  79. 730  IF A$ < >"Y"  AND A$ < >"N"  THEN 720
  80. 740  IF A$ = "Y"  THEN 770
  81. 750 P1 = M1:P2 = M2: GOSUB 1090: CALL 777:P2 = P1: REM  ZERO BUFFER
  82. 760  GOSUB 1150: GOTO 780: REM  PRINT STATUS
  83. 770 O1 = P1:P1 = P2:P2 = M2: GOSUB 1090: CALL 777:P2 = P1:P1 = O1: REM   ZERO REMAINING BUFFER
  84. 780  CALL  -868: INPUT "FILENAME ? ";F$: PRINT  CHR$(4)"BLOAD"F$S$",A" INT(P2)
  85. 790 P2 = P2 + FN PK( -21920): REM   CALCULATE END OF  BLOAD
  86. 800  IF P2 >M2  THEN  PRINT "ERROR:BLOAD WENT PAST HIMEM": PRINT "PLEASE REBOOT": END 
  87. 810  RETURN 
  88. 820  REM   RESET P1 AND P2
  89. 830 P1 = O1:P2 = O2
  90. 840  RETURN 
  91. 850  REM   SET PARAMETERS
  92. 860  PRINT "ENTER NEW VALUE OR RETURN IF NO CHANGE"
  93. 870  PRINT : PRINT "P1="; INT(P1);
  94. 880  INPUT "  ";A$: IF  LEN(A$) = 0  THEN 910
  95. 890 T1 =  VAL(A$): IF T1 > = M1  AND T1 < = M2  THEN P1 = T1: GOTO 910: REM    ACCEPT IF IN RANGE
  96. 900  GOTO 860
  97. 910  PRINT "P2="; INT(P2);
  98. 920  INPUT "  ";A$: IF  LEN(A$) = 0  THEN 950
  99. 930 T2 =  VAL(A$): IF T2 < = M2  AND T2 > = P1  THEN P2 = T2: GOTO 950: REM    ACCEPT IF IN RANGE
  100. 940  GOTO 910
  101. 950 T1 = 5 *(TD -1) +87: REM COMPUTE DELAY TIME
  102. 960  PRINT "SAMPLE INTERVAL="; INT(T1);
  103. 970  INPUT "  ";A$: IF  LEN(A$) = 0  THEN  GOTO 1000
  104. 980 T2 =  VAL(A$): IF T2 <87  OR T2 >343  THEN  GOTO 950: REM  343=256+87(MAX DELAY THAT FITS IN ONE BYTE)
  105. 990 TD =  INT((T2 -87)/5) +1: POKE 780, INT(TD):BS = 1/(8 *(5 *(TD -1) +87) *1E -6)
  106. 1000  PRINT "TIME WINDOW="; INT(TW);
  107. 1010  INPUT "  ";A$: IF  LEN(A$) = 0  THEN  GOTO 1040
  108. 1020 T3 =  VAL(A$): IF T3 >0  AND M1 +BS *T3 <M2  THEN TW = T3: GOTO 1040
  109. 1030  GOTO 1000
  110. 1040  RETURN 
  111. 1050  REM   QUIT
  112. 1060  GOSUB 1300: REM   RESET HIMEM
  113. 1070  HOME 
  114. 1080  END 
  115. 1090  REM   SETUP P1 AND P2
  116. 1100  POKE 7, INT(P1/256): POKE 6, INT(P1 -256 * INT(P1/256))
  117. 1110  POKE 9, INT(P2/256): POKE 8, INT(P2 -256 * INT(P2/256))
  118. 1120  RETURN 
  119. 1130  REM   PAUSE
  120. 1140  FOR I = 1 TO 200: NEXT I: RETURN 
  121. 1150  REM   PRINT STATUS
  122. 1160 CV =  PEEK(37): REM  SAVE CURSOR ROW
  123. 1170  VTAB 22: CALL  -868: REM  CLEAR LINE
  124. 1180  VTAB 22: INVERSE : PRINT "MIN "; INT(M1);" MAX "; INT(M2);" P1 "; INT(P1);" P2 "; INT(P2): NORMAL 
  125. 1190  VTAB CV: REM  RESTORE CURSOR
  126. 1200  RETURN 
  127. 1210  REM   ERROR
  128. 1220 ER =  PEEK(222)
  129. 1230  PRINT "ERROR # ";ER
  130. 1240  POKE 216,0
  131. 1250  PRINT "RESTARTING PROGRAM"
  132. 1260  GOSUB 1300: REM   RESTORE HIMEM
  133. 1270  CLEAR : REM  RESET SUBROUTINE STACK,ETC
  134. 1280  FOR I = 1 TO 2000: NEXT I: REM   PAUSE
  135. 1290  GOTO 30
  136. 1300  REM   RESET HIMEM
  137. 1310  POKE 116, INT(M2/256): POKE 115,(M2 -256 * PEEK(116))
  138. 1320  RETURN